package org.Niu.July7th.genericsTest;

/**
 * 手写一个泛型类
 * @param <T>
 */
public class Pair<T> {
    private T first;
    private T last;
    public Pair(T first, T last) {
        this.first = first;
        this.last = last;
    }
    public T getFirst() { return this.first; }
    public T getLast() {  return this.last; }

    // 注意：静态泛型方法应该使用其他类型区分:
    public static <K> Pair_<K> create(K first, K last) {
        return new Pair_<K>(first, last);
    }

    // 泛型是一种类似”模板代码“的技术，不同语言的泛型实现方式不一定相同。
    // Java语言的泛型实现方式是擦拭法（Type Erasure）。
    // 所谓擦拭法是指，虚拟机对泛型其实一无所知，所有的工作都是编译器做的。
    // Java的泛型是由编译器在编译时实行的，编译器内部永远把所有类型T视为Object处理，
    // 但是，在需要转型的时候，编译器会根据T的类型自动为我们实行安全地强制转型。
    // 局限1：<T>不能是基本类型，例如int，因为实际类型是Object，Object类型无法持有基本类型
    // 局限2：无法取得带泛型的Class
    // 局限3：无法判断带泛型的类型：
    // 局限4：不能实例化T类型：

    // 7.4 擦除法


}
